
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>MyBatis核心对象有那些？以及它们的作用？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>MyBatis核心对象有那些？以及它们的作用？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">核心对象</div>
          <div class="card-question">在 MyBatis 中，SqlSessionFactory 的核心作用是什么？为什么推荐它在应用中作为单例存在？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">核心对象</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SqlSessionFactory 的核心作用是作为一个工厂对象，用于创建 SqlSession 实例。它被推荐作为单例存在，是因为它的创建过程（解析配置文件、构建环境等）是相对昂贵的操作，在应用的整个生命周期中重复使用同一个实例可以提高性能并有效管理资源。</div>
          </div>
          <div class="card-source">来源: MyBatis 核心对象 -> 1. SqlSessionFactory</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">生命周期</div>
          <div class="card-question">MyBatis 的 SqlSession 对象的推荐生命周期是怎样的？为什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">生命周期</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SqlSession 的生命周期应该是短暂的，通常是方法级的。在一次数据库操作完成后，应立即关闭 SqlSession。这是为了及时释放数据库连接等资源，避免资源泄漏。</div>
          </div>
          <div class="card-source">来源: MyBatis 核心对象 -> 2. SqlSession</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">MyBatis 中的 Mapper 接口是如何工作的？它如何实现业务代码与 SQL 的分离？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Mapper 接口定义了与数据库交互的方法。MyBatis 会在运行时为这些接口动态创建代理实现类。每个接口与一个 XML 映射文件关联，该文件定义了方法对应的 SQL 语句，从而将 SQL 映射与 Java 代码分离，提供了一个清晰的抽象层。</div>
          </div>
          <div class="card-source">来源: MyBatis 核心对象 -> 3. Mapper 接口</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">核心对象</div>
          <div class="card-question">MyBatis 的 Configuration 对象主要负责什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">核心对象</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Configuration 对象持有 MyBatis 全局配置的所有信息，包括数据源、事务管理器、Mapper 注册信息、类型处理器和插件配置等。它在 SqlSessionFactory 创建过程中被初始化，是 MyBatis 运行的基础。</div>
          </div>
          <div class="card-source">来源: MyBatis 核心对象 -> 4. Configuration</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Executor 在 MyBatis 架构中扮演什么角色？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Executor 是 MyBatis 的执行器接口，是执行数据库操作的核心。它负责具体的 SQL 语句执行、缓存维护以及事务管理。MyBatis 提供了多种类型的执行器，如简单执行器和批量执行器。</div>
          </div>
          <div class="card-source">来源: MyBatis 核心对象 -> 5. Executor</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">核心对象</div>
          <div class="card-question">MappedStatement 对象在 MyBatis 内部代表什么？它包含了哪些关键信息？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">核心对象</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MappedStatement 对象是 MyBatis 内部用来表示一个具体的 SQL 映射语句（如<select>, <insert>等）的对象。它包含了执行该 SQL 所需的所有信息，例如语句的 ID、参数类型、返回类型以及 SQL 字符串本身。</div>
          </div>
          <div class="card-source">来源: MyBatis 核心对象 -> 6. MappedStatement</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">关系</div>
          <div class="card-question">请简述 SqlSessionFactory、SqlSession 和 Executor 三者之间的关系。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">关系</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SqlSessionFactory 是创建 SqlSession 的工厂。当需要执行数据库操作时，通过 SqlSessionFactory 创建一个 SqlSession 实例。而 SqlSession 内部会使用 Executor 来具体执行 SQL 语句、管理事务和缓存。</div>
          </div>
          <div class="card-source">来源: MyBatis 核心对象的关系</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">关系</div>
          <div class="card-question">在一次数据库查询中，Executor 和 MappedStatement 是如何协作的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">关系</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在执行数据库操作时，Executor 依赖于 MappedStatement 来获取 SQL 的详细信息。MappedStatement 提供了要执行的 SQL 字符串、参数绑定方式和结果映射规则，Executor 根据这些信息来完成最终的数据库交互。</div>
          </div>
          <div class="card-source">来源: MyBatis 核心对象的关系</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">MyBatis 的 Mapper 接口提供了什么主要优点？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Mapper 接口的主要优点是实现了业务逻辑与数据访问逻辑的分离。它通过定义清晰的 Java 方法来代表数据库操作，使得开发人员可以将 SQL 语句配置在 XML 文件中，从而让代码更清晰、更易于维护。</div>
          </div>
          <div class="card-source">来源: MyBatis 核心对象 -> 3. Mapper 接口</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
